package com.study.springboot2.config;

import com.study.springboot2.properties.HelloServiceProperties;
import com.study.springboot2.service.HelloService;
import com.study.springboot2.service.OrderService;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;

@Configuration
//@EnableConfigurationProperties(HelloServiceProperties.class)
//@ConditionalOnProperty(prefix = "hello", value = "enable", havingValue = "true")
//Spring Boot通过@ConditionalOnProperty来控制Configuration是否生效

//在application.properties配置"hello.enable"，对应的值为true, 和havingValue一致，则该配置类生效;
//@ConditionalOnProperty(prefix = "hello", value = "enable", matchIfMissing = true)
//matchIfMissing缺少该property时是否可以加载。如果为true，没有该property也会正常加载；反之报错
public class HelloServiceAutoConfiguration {

    @Bean
    @ConditionalOnClass(HelloService.class)  //@ConditionalOnClass（某个class位于类路径上，才会实例化一个Bean）
    //举例来说，如果在maven中引入了velocity，那么视图就使用velocity，若引入的是freemarker，则使用freemarker.
    public HelloService helloService() {
        return new HelloService();
    }

    @Bean
    @ConditionalOnMissingClass(value = {"com.study.springboot2.service.OrderServicetmp"}) //（仅仅在当前上下文中不存在某个对象时，才会实例化一个Bean）
    //这样OrderService 不会被实例化
    //如果@ConditionalOnMissingClass(value = {"com.study.springboot2.service.OrderService"}) 用来修饰HelloServiceAutoConfiguration配置类则
    //整个配置类都不会配置，包括HelloService 配置。
    public OrderService orderService() {
        return new OrderService();
    }

}

/**

 spring框架还提供了很多@Condition给我们用，当然总结用语哪种好理解，看给位读者喽

 @ConditionalOnBean（仅仅在当前上下文中存在某个对象时，才会实例化一个Bean）
 @ConditionalOnClass（某个class位于类路径上，才会实例化一个Bean）
 @ConditionalOnExpression（当表达式为true的时候，才会实例化一个Bean）
 @ConditionalOnMissingBean（仅仅在当前上下文中不存在某个对象时，才会实例化一个Bean）
 @ConditionalOnMissingClass（某个class类路径上不存在的时候，才会实例化一个Bean）
 @ConditionalOnNotWebApplication（不是web应用）

 */